/**
  ******************************************************************************
  * @file: misc.c
  * @brief: 
  * @author: Mond
  ******************************************************************************
  * @version: 0.1.0
  * @date: 2021/12/11
  * @lastChange: 2021/12/11
  * @history:
  ******************************************************************************
    */

#include "misc.h"

/*!
 * 次方函数
 * @param x 底数
 * @param y 指数
 * @return x 的 y 次方
 */
uint32_t my_Pow(uint32_t x, uint32_t y) {
    uint32_t result = 1;
    while (y--)
        result *= x;
    return result;
}

/*!
 * 整数转字符串
 * @param val 整数值
 * @param len 字符串长度
 * @param str 存放字符串地址
 */
void int_To_String(int32_t val, uint8_t len, unsigned char *str) {
    uint8_t cursor = 0;
    if (val < 0) {
        *str = '-';
        len--;
        cursor++;
        val = -val;
    }
    uint8_t i;
    for (i = 0; i < len; i++) {
        *(str + cursor) = val / my_Pow(10, len - i - 1) % 10 + '0';
        cursor++;
    }
}

/*!
 * 浮点数转字符串
 * @param val 浮点数值
 * @param f_num 保留小数位数
 * @param len 转字符串长度，包含小数点，符号（若为负数）
 * @param str 存储字符串的地址
 */
void float_To_String(double val, uint8_t f_num, uint8_t len, unsigned char *str) {
    uint32_t digits = my_Pow(10, f_num);
    uint8_t cursor = 0;
    if (val < 0) {
        *str = '-';
        len--;
        cursor++;
        val = -val;
    }
    int32_t tmp = (int32_t) (val * digits) / digits;
    int_To_String(tmp, len - f_num - 1, str + cursor);
    *(str + cursor + len - f_num - 1) = '.';
    tmp = (int32_t) (val * digits) % digits;
    int_To_String(tmp, f_num, str + cursor + len - f_num);
}